mod_rewrite モジュールについて5回でまとめています。
その1 リダイレクトの基本
その2 RewriteCond ディレクティブ ← 今回
その3 様々なリダイレクト利用例
その4 HTTP 環境変数一覧
その5 RewriteRule のフラグ一覧
今回は、RewriteCond ディレクティブについてまとめます。これを利用することによって、RewriteRule の条件を更に定義することができます。
具体的によく利用されるものとしては、“>「wwwありなし設定」、「index.htmlありなし設定」、「https(SSL)へリダイレクト」などが行えます。
RewriteCondの基本構文
RewriteEngine On
RewriteCond テスト文字列 条件パターン [フラグ]
RewriteRule 条件 置換文字列 [フラグ]
RewriteCond は、RewriteRule の前に、一つ以上設置できます。複数設置した場合は、フラグによって、OR 条件、AND 条件を指定できます。(省略すると AND になります。)
RewriteCond に利用できるフラグ(オプション)
フラグ | 説明 |
---|---|
[OR] | 連続する RewriteCond のいずれかが true の場合に実行。省略時は、AND 条件として処理。 |
[NC] | 条件を評価する時、大文字小文字を区別しない。 |
RewriteRule にも条件が記述されているわけですが、条件のマッチングから置換までの流れはこのようになります。
RewriteRule 条件
↓
RewriteCond テスト文字列
↓
RewriteCond 条件パターン
↓
RewriteRule 置換文字列
RewriteRule の条件と置換の間に、RewriteCond の条件が入れ子になっているような順番となります。
RewriteCond の「テスト文字列」には「HTTP 環境変数」
RewriteCond の「条件パターン」には「演算子」が利用できます。
それぞれまとめます。
RewriteCond で利用できる HTTP 環境変数(テスト文字列)
HTTPリクエストヘッダの情報は “%{環境変数名}” と指定することで RewriteCond で利用できます。
例えば「HTTP_HOST」という環境変数は、リクエスト先のホスト名 (DNS 名) 情報を示し、” %{HTTP_HOST} ” とすると、http://www.hazu.jp/~” でアクセスがあった場合、” www.hazu.jp ” という DNS 名が返されます。
RewriteCond で利用できる主な環境変数の一覧です。
種類 | 環境変数名 |
---|---|
ヘッダ環境変数 | HTTP_HOST, HTTP_USER_AGENT, HTTP_REFERER, HTTP_ACCEPT |
サーバー環境変数 | SERVER_NAME, SERVER_ADDR, SERVER_PORT |
リクエスト環境変数 | EMOTE_ADDR, REMOTE_HOST, REMOTE_USER, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING |
日付・時刻変数 | TIME_YEAR, TIME_MON, TIME_DAY, TIME_TIME_HOUR, TIME_MIN, TIME_SEC, TIME |
その他 | THE_REQUEST, REQUEST_URI, REQUEST_FILENAME, HTTPS |
それぞれの環境変数の意味や、値の例をこちらにまとめました。
⇒ mod_rewrite モジュール – その4 HTTP 環境変数一覧
RewriteCond で利用できる演算子(条件パターン)
条件に一致するものを選び出すのに演算子、正規表現が利用できます。
RewriteCond 利用できる主な演算子の一覧です。
演算子 | 説明 |
---|---|
! | 否定 |
< | テスト文字列より大きい場合は true |
> | テスト文字列より小さい場合は true |
= | テスト文字列と等しい場合は true |
<= | テスト文字列以上の場合は true |
>= | テスト文字列以下の場合は true |
-d | テスト文字列のディレクトリが存在する場合 true |
-f | テスト文字列のファイルが存在する場合 true |
-s | テスト文字列のファイルが存在し、サイズが0byteでない場合 true |
RewriteCond における後方参照
後方参照については、前にこちらにまとめました。
⇒ 後方参照
RewriteRule において、後方参照は、” $n “ と表記されますが、
RewriteCond においては、” %n “ と表されます。
二つを同時に利用できるように、別の表記となっているのだと思います。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^(.*)/(.*)/index.html$
# ↑"%1" ↑"%2"
RewriteRule ^/blog/(.*)/(.*)$ /$1/%1/$2/%2
# ↑"$1" ↑"$2" 後方参照 ↑
.htaccess についてのあと、毎回言っていますが、最後に空行が必要です。お忘れなく。